broadway: Unsure we clear the grab on window hide
authorAlexander Larsson <alexl@redhat.com>
Fri, 5 Apr 2013 15:06:09 +0000 (17:06 +0200)
committerAlexander Larsson <alexl@redhat.com>
Fri, 5 Apr 2013 15:07:04 +0000 (17:07 +0200)
gdk/broadway/gdkdevice-broadway.c
gdk/broadway/gdkprivate-broadway.h
gdk/broadway/gdkwindow-broadway.c

index b87186ed33c9b9520fed5aae1c530f9d1aa45bd0..f8dec2308b2a326600f3ac4f60c152915a397567 100644 (file)
@@ -211,6 +211,29 @@ gdk_broadway_device_query_state (GdkDevice        *device,
   return;
 }
 
+void
+_gdk_broadway_window_grab_check_unmap (GdkWindow *window,
+                                      gulong     serial)
+{
+  GdkDisplay *display = gdk_window_get_display (window);
+  GdkDeviceManager *device_manager;
+  GList *devices, *d;
+
+  device_manager = gdk_display_get_device_manager (display);
+
+  /* Get all devices */
+  devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER);
+  devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_SLAVE));
+  devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING));
+
+  /* End all grabs on the newly hidden window */
+  for (d = devices; d; d = d->next)
+    _gdk_display_end_device_grab (display, d->data, serial, window, TRUE);
+
+  g_list_free (devices);
+}
+
+
 void
 _gdk_broadway_window_grab_check_destroy (GdkWindow *window)
 {
index 8277c0880a34124489b12f9cf886da2ea5188450..e611ca8c393631702b3c63f7401806aa8e04a34a 100644 (file)
@@ -92,6 +92,8 @@ gboolean _gdk_broadway_moveresize_configure_done (GdkDisplay *display,
 
 void     _gdk_broadway_selection_window_destroyed (GdkWindow *window);
 void     _gdk_broadway_window_grab_check_destroy (GdkWindow *window);
+void     _gdk_broadway_window_grab_check_unmap (GdkWindow *window,
+                                               gulong     serial);
 
 void _gdk_keymap_keys_changed     (GdkDisplay      *display);
 gint _gdk_broadway_get_group_for_state (GdkDisplay      *display,
index 3784b5a57c465607e0e0997aed577db7b257a8e7..7919d1c168d9871dc09f99460558940325471944 100644 (file)
@@ -437,6 +437,10 @@ gdk_window_broadway_hide (GdkWindow *window)
     _gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE);
 
   broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
+
+  _gdk_broadway_window_grab_check_unmap (window,
+                                        _gdk_broadway_server_get_next_serial (broadway_display->server));
+
   if (_gdk_broadway_server_window_hide (broadway_display->server, impl->id))
     queue_flush (window);